package com.bulk.calculate;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;

/**
 * 计算精度丢失
 *
 * @author 散装java
 */
public class CalculateBug {
    public static void main(String[] args) {
        double num1 = 2.0;
        double num2 = 1.1;
        double num3 = num1 - num2;
        System.out.println("num3==>" + num3);

    }











    /**
     * bigDecimal 处理 示例
     */
    public static void bigDecimalDemo() {
        BigDecimal decimal1 = new BigDecimal("2.0");
        BigDecimal decimal2 = new BigDecimal("1.1");
        BigDecimal decimal3 = decimal1.subtract(decimal2);
        System.out.println("decimal3 ===> " + decimal3);
        System.out.println("小数点四舍五入 ===> " + decimal1.subtract(decimal2).setScale(0, RoundingMode.HALF_UP));

    }

    /**
     * double 形式的数据传入 传入 bigDecimal 时候，注意 使用 要变成string类型
     */
    public static void bigDecimalByDouble() {
        double a = 0.1;
        double b = 0.2;
        BigDecimal a1 = new BigDecimal(a);
        BigDecimal a2 = new BigDecimal(b);
//        BigDecimal a1 = new BigDecimal(Double.toString(a));
//        BigDecimal a2 = new BigDecimal(Double.toString(b));
        System.out.println("double -> bigDecimal -> a: " + a1);
        System.out.println("double -> bigDecimal -> b: " + a2);
        System.out.println("double -> bigDecimal - a+b: " + a1.add(a2));
    }

    /**
     * 做除法的时候， 要制定保留的小数位数 ，不然会抛出异常 java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
     */
    public static void bigDecimalDivide() {
        BigDecimal decimal1 = new BigDecimal("10");
        BigDecimal decimal2 = new BigDecimal("3");
        BigDecimal result = decimal1.divide(decimal2);
//        BigDecimal result = decimal1.divide(decimal2,2,RoundingMode.HALF_UP);
        System.out.println(result);

    }

    /**
     * BigDecimal 格式化 利率小例子
     */
    public static void bigDecimalFormat() {
        //建立货币格式化引用
        NumberFormat currency = NumberFormat.getCurrencyInstance();
        //建立百分比格式化引用
        NumberFormat percent = NumberFormat.getPercentInstance();
        //百分比小数点最多3位
        percent.setMaximumFractionDigits(3);
        //贷款金额
        BigDecimal loanAmount = new BigDecimal("300000");
        //利率
        BigDecimal interestRate = new BigDecimal("0.008");
        //相乘
        BigDecimal interest = loanAmount.multiply(interestRate);
        System.out.println("贷款金额:\t" + currency.format(loanAmount));
        System.out.println("利率:\t" + percent.format(interestRate));
        System.out.println("利息:\t" + currency.format(interest));
    }

    /**
     * 位运算
     */
    public static void bitOperation() {
        int i = 10;
        // 位运算
        System.out.println(i << 1);
        System.out.println(i >> 1);
    }

}
